20 'IBM PC Version 1.00, Copyright 1983 by Marc Ringuette
100 GOTO 40000
500 T$="Main Menu":NUMCH=8:T$(1)="Add/Edit Classes and Students":T$(2)="Add a New Activity":T$(3)="Edit Existing Activities":T$(4)="Save/Retrieve Backup Copy of Data":T$(5)="Display Data (On the Screen)":T$(6)="Print Data (On Paper)"
510 T$(7)="Switch to a Different Data Disk":T$(8)="Change Disk/Printer Setup":T$(0)="End Session":GOSUB 21000:ON CH GOTO 2500,1000,1500,6000,6500,6600,10000,11000,19000
1000 GOSUB 20250:IF AB THEN 500 ELSE IF NUMAC>=MAXAC THEN CLS:LOCATE 10,20:PRINT"Too many activities already exist.":GOSUB 20000:GOTO 500
1020 AC=NUMAC+1:AC$(AC)=SPACE$(20):WT(AC)=10000:GR(0,AC)=10000:GOSUB 25000:IF AB THEN 500 ELSE FOR A=1 TO NUMST:GR(A,AC)=-1:NEXT:GOSUB 25500:IF AB THEN 500 ELSE NUMAC=AC:GOSUB 22300
1030 GOSUB 22700:GOTO 500
1500 T$="Edit Existing Activities":NUMCH=4:T$(1)="Edit Grades in an Activity":T$(2)="Edit Name/Total/Weight of an Activity":T$(3)="Delete an Activity":T$(4)="Delete All Activities of a Class"
1510 T$(0)="Return to Main Menu":GOSUB 21000:ON CH GOTO 1600,1700,1800,1900,500
1600 GOSUB 20260:IF AB THEN 1500 ELSE GOSUB 20450:IF AB THEN 1500 ELSE GOSUB 25500:IF AB THEN LOADED=0:GOTO 1500 ELSE GOSUB 22300:GOTO 1500
1699 '---- Edit name/tot/wt ----
1700 GOSUB 20260:IF AB THEN 1500
1710 GOSUB 20450:IF AB THEN 1500 ELSE GOSUB 25000:IF AB THEN LOADED=0:GOTO 1500
1800 GOSUB 20260:IF AB THEN 1500 ELSE GOSUB 20450:IF AB THEN 1500 ELSE CLS:LOCATE 6:GOSUB 21400:LOCATE ,25:PRINT"Activity"AC": "AC$(AC):M$="delete this activity":GOSUB 21250:IF NO THEN GOSUB 21210:GOTO 1500
1810 PRINT:PRINT"Deleting activity.";:LOADED=0:FOR A=AC TO NUMAC-1:PRINT".";:AC$(A)=AC$(A+1):WT(A)=WT(A+1):FOR B=0 TO NUMST:GR(B,A)=GR(B,A+1):NEXT:NEXT:PRINT:NUMAC=NUMAC-1:GOSUB 22300:GOTO 1500
1900 GOSUB 20300:IF AB THEN 1500 ELSE GOSUB 22200:CLS:LOCATE 8:GOSUB 21400:LOCATE 10,24:PRINT NUMST"Students,"NUMAC"Activities Graded.":M$="delete all activities of this class":GOSUB 21250:IF NO THEN GOSUB 21210:GOTO 1500
1910 NUMAC=0:GOSUB 22300:GOTO 1500
2500 T$="Add/Edit Classes and Students":NUMCH=4:T$(1)="Add/Edit Class Names":T$(2)="Add/Edit Students & ID Codes":T$(3)="Sort Roster of a Class"
2510 T$(4)="Delete All Classes & Start Over":T$(0)="Return to Main Menu":GOSUB 21000:ON CH GOTO 3500,2600,3000,4100,500
2600 GOSUB 20300:IF AB THEN 2500 ELSE GOSUB 22200:FOR ST=NUMST+1 TO MAXST:GOSUB 29000:NEXT
2610 OKEX$=ESC$+FIL$+INS$+DEL$+REGEX$:CLS:GOSUB 21500:M$="student":GOSUB 21550:F$="###. [\"+SPACE$(18)+"\]"+SPACE$(6)+"[\"+SPACE$(10)+"\]":FLIN=1:CURR=1:LEFSIDE=TRUE:LLIN=WSIZ:IF LLIN>MAXST THEN LLIN=MAXST
2620 COLOR 15,0:LOCATE 4,25:PRINT" Student ":LOCATE 4,51:PRINT" ID Code ":COLOR 7,0
2630 LOCATE 1,1:GOSUB 21400:GOSUB 2960
2640 FOR A=FLIN TO LLIN:LOCATE WTOP+A-FLIN,WLEF:PRINT USING F$;A;ST$(A);ID$(A):NEXT
3000 T$="Sort roster of a class":NUMCH=5:T$(1)="Sort by Last Names":T$(2)="Sort by First Names":T$(3)="Sort by ID Codes":T$(4)="Sort by Averages":T$(5)="Design Your Own Order":T$(0)="Return to Menu":GOSUB 21000:IF CH=6 THEN 2500
3010 IF CH=4 THEN GOSUB 20260 ELSE GOSUB 20250
3020 IF AB THEN 3000 ELSE ON CH GOSUB 26000,26050,26080,26100,26150:IF AB THEN 3000
3030 CLS:PRINT TAB(25)"Here is the new order:":FOR C=1 TO NUMST:LOCATE (C-1) MOD 20+4,(((C-1) MOD 40)\20)*40+1:PRINT USING FMT1$+" \"+SPACE$(10)+"\";C;ST$(I(C));ID$(I(C)):IF C MOD 40=0 THEN GOSUB 20000:CLS
3040 NEXT:M$="Should this new order permanently replace the old one":GOSUB 21350:IF NO THEN M$="Existing order not changed":GOSUB 21200:GOTO 3000 ELSE GOSUB 26300:GOSUB 22300:GOTO 3000
3500 OKEX$=ESC$+FIL$+INS$+DEL$+REGEX$:CLS:GOSUB 21500:M$="class":GOSUB 21550:F$="###. [\"+SPACE$(18)+"\]":LOADED=0:NEWCL=NUMCL:FOR A=1 TO NEWCL:ST$(A)=CL$(A):I(A)=A:WT(A)=TRUE:NEXT:FOR A=NEWCL+1 TO MAXCL:ST$(A)=SPACE$(20):NEXT
3510 FLIN=1:CURR=1:LLIN=WSIZ:IF LLIN>MAXCL THEN LLIN=MAXCL
3520 LOCATE 1,1:M$=T$(CH):GOSUB 21450:GOSUB 3750
3530 FOR A=FLIN TO LLIN:LOCATE WTOP+A-FLIN,WLEF:PRINT USING F$;A;ST$(A):NEXT
3540 OK$="":LOCATE WTOP+CURR-FLIN,22:IN$=ST$(CURR):ILEN=20:GOSUB 20100:IF CHANGED THEN WHILE RIGHT$(IN$,1)=" ":IN$=LEFT$(IN$,LEN(IN$)-1):WEND:ST$(CURR)=IN$
3550 IF CHANGED AND CURR>NEWCL THEN FOR A=NEWCL+1 TO CURR:I(A)=0:NEXT:NEWCL=CURR:GOSUB 3750
3560 IF EX$=RET$ OR EX$=TAB$ OR EX$=DNARR$ THEN CURR=CURR+1:GOTO 3650
3570 IF EX$=UPARR$ THEN CURR=CURR-1:GOTO 3650
3580 IF EX$<>INS$ THEN 3600 ELSE IF CURR>NEWCL THEN 3780 ELSE M$="insert a class before #"+STR$(CURR)+" ":GOSUB 21250:IF NO THEN 3600 ELSE IF NEWCL=MAXCL THEN M$="The list is full":GOSUB 21200:GOTO 3600
3590 FOR A=NEWCL TO CURR STEP -1:ST$(A+1)=ST$(A):I(A+1)=I(A):NEXT:ST$(CURR)=SPACE$(20):I(CURR)=0:NEWCL=NEWCL+1:GOSUB 3750:GOTO 3530
3600 IF EX$<>DEL$ THEN 3650 ELSE IF CURR>NEWCL THEN 3780 ELSE M$="permanently delete class #"+STR$(CURR)+" ":GOSUB 21250:IF NO THEN 3650
3610 WT(I(CURR))=FALSE:FOR A=CURR TO NEWCL-1:ST$(A)=ST$(A+1):I(A)=I(A+1):NEXT:ST$(NEWCL)=SPACE$(20):NEWCL=NEWCL-1:GOSUB 3750:GOTO 3530
3650 IF CURR>MAXCL THEN CURR=MAXCL ELSE IF CURR<1 THEN CURR=1
3660 IF EX$=ESC$ THEN M$="abandon all changes":GOSUB 21250:IF YES THEN 2500
3670 IF EX$<>FKEY1$ THEN 3540
3700 M$="Are all class names now correct":GOSUB 21350:IF NO THEN 3540 ELSE B=FALSE:FOR A=1 TO NUMCL:IF I(A)<>A AND I(A)<>0 THEN B=TRUE
3705 NEXT:IF B THEN CLS:LOCATE 8,20:PRINT"Warning: Any backup data disks you have made":PRINT TAB(20)"may no longer be accessible.":LOCATE 11,20:PRINT"See manual for details.":GOSUB 20000
3710 GOSUB 22350:DRIVE$=DDRIVE$:FOR CL=1 TO NUMCL:IF NOT WT(CL) THEN GOSUB 22100
3720 NEXT:FOR A=1 TO NEWCL:CL$(A)=ST$(A):B=I(A):IF B>0 THEN C=I(B):WHILE B<A AND C>0:B=C:C=I(B):WEND:IF B<>A THEN IF WT(A) THEN GOSUB 22110 ELSE GOSUB 22120:WT(B)=FALSE
3730 NEXT:NUMST=0:NUMAC=0:FOR CL=1 TO NEWCL:IF I(CL)=0 THEN GOSUB 22310
3780 M$="You're past the end of the list":GOSUB 21200:GOTO 3540
4099 '---- Delete all classes ----
4100 CLS:LOCATE 8,20:PRINT NUMCL"Classes Now Exist.":LOCATE 10,10:PRINT"If you enter 'Y', all class information on the data disk":PRINT TAB(10)"will be permanently erased.":M$="delete all classes now":GOSUB 21250:IF NO THEN GOSUB 21210:GOTO 2500
4110 DRIVE$=DDRIVE$:FOR CL=1 TO NUMCL:GOSUB 22100:NEXT:NUMCL=0:GOSUB 22500:GOTO 2500
6000 T$="Save/Retrieve Backup Copy of Data":NUMCH=2:T$(1)="Save a Backup Copy of a Class' Data":T$(2)="Retrieve Backup Data Saved Earlier":T$(0)="Return to Main Menu":GOSUB 21000:ON CH GOTO 6100,6300,500
6100 GOSUB 20300:IF AB THEN 6000 ELSE GOSUB 22200
6110 GOSUB 22600:GOTO 6000
6300 GOSUB 20300:IF AB THEN 6000
6310 M$="retrieve":GOSUB 29050:IF CHAR=2 THEN LOADED=0:PRINT:DRIVE$=BDRIVE$:GOSUB 22210:LOADED=0 ELSE 6000
6340 GOSUB 29100:CLS:PRINT:PRINT:GOSUB 21400:IF ST$(0)<>LEFT$(CL$(CL)+SPACE$(20),20) THEN PRINT TAB(15)"Possible error: the class data you have loaded":PRINT TAB(15)"was stored with the name "ST$(0)
6350 LOCATE 8,15:PRINT"The data loaded had"NUMST"students, and"NUMAC"activities.":LOCATE 10,15:IF NUMAC>0 THEN PRINT"The latest activity entered was #"NUMAC": "AC$(NUMAC)
6360 M$="save this in place of the existing class data":GOSUB 21250:IF YES THEN GOSUB 22300 ELSE GOSUB 21210
6370 GOTO 6000
6500 IF PR THEN PR=FALSE:SWAP P1$,P2$
6510 GOTO 7000
6600 IF NOT PR THEN PR=TRUE:SWAP P1$,P2$
6610 GOTO 7000
7000 T$=P1$+"Menu":NUMCH=8
7010 T$(1)=P1$+"Class Averages":T$(2)=P1$+"a Student's Grades":T$(3)=P1$+"Results of an Activity":T$(4)=P1$+"Condensed Results of All Activities of a Class":T$(5)=P1$+"Details of All Activities of a Class"
7020 T$(6)=P1$+"a Class Roster & ID Codes":T$(7)=P1$+"Class Averages & Letter Grade Equivalents":T$(8)="Weekly Class Roster":T$(0)="Return to Main Menu":GOSUB 21000:CH1=CH:ON CH GOTO 7200,7300,7400,7500,7600,7700,7800,8000,500
7200 GOSUB 20260:IF AB THEN 7000 ELSE GOSUB 27000:IF AB THEN 7000 ELSE IF NOT AVGS THEN GOSUB 26500
7210 GOSUB 27500:IF AB THEN 7000 ELSE PRINT#1,FNC$("Student Averages:"):PRINT#1,:LIN=LIN+2:FOR A=1 TO NUMST:ST=I(A):GOSUB 29500:PRINT#1,USING SPACE$(13)+FMT1$+SPACE$(15);A;A$;
7220 IF GR(ST,0)<0 THEN PRINT#1,"No Grade" ELSE PRINT#1,USING"####.# %";GR(ST,0)/100
7230 GOSUB 27600:IF AB THEN 7240 ELSE NEXT:IF GR(0,0)>=0 THEN PRINT#1,:GOSUB 27600:PRINT#1,USING SPACE$(27)+"Class Average:####.## %";GR(0,0)/100:GOSUB 27600
7240 GOSUB 27700:GOTO 7000
7300 GOSUB 20250:IF AB THEN 7000 ELSE CLS:LOCATE 8,20:PRINT"You May "P1$"Grades of:":PRINT:PRINT TAB(25)"1) One Student":PRINT TAB(25)"2) All Students":PRINT:PRINT TAB(20)"Your Choice (or <ESC> to Cancel):";
7305 OK$="12"+ESC$:GOSUB 20200:IF CHAR=1 THEN GOSUB 20400:IF AB THEN 7000 ELSE FI=ST:LA=ST ELSE IF CHAR=2 THEN FI=1:LA=NUMST ELSE 7000
7310 GOSUB 27500:IF AB THEN 7000 ELSE FOR ST=FI TO LA:PRINT#1,SPACE$(12-10*(ID$(ST)=SPACE$(12)))"Student Summary for: "ST$(ST)SPACE$(4)ID$(ST):F$=SPACE$(4)+FMT1$+SPACE$(5)+FMT2$+SPACE$(4)+FMT2$+" / "+FMT2$+SPACE$(3):PRINT#1,
7430 X=0:Y=0:FOR A=1 TO NUMST:ST=I(A):GOSUB 29500:Z=GR(ST,AC)/GR(0,AC):PRINT#1,USING F$;A;A$;FNM$(GR(ST,AC));:IF Z<0 THEN PRINT#1," ----" ELSE X=X+Z:Y=Y+1:PRINT#1,USING"###.# %";Z*100
7440 GOSUB 27600:IF AB THEN 7450 ELSE NEXT:PRINT#1,:IF Y>0 THEN PRINT#1,USING SPACE$(27)+"Class Average:####.## %";X/Y*100
7450 GOSUB 27600:GOSUB 27700:GOTO 7000
7500 GOSUB 20260:IF AB THEN 7000
7510 W=10:IF NUMAC<=W THEN AC=1 ELSE D=1:M2$="printed first, ":GOSUB 20460:IF AB THEN 7000
7520 FI=AC:LA=AC+W-1:IF LA>NUMAC THEN LA=NUMAC
7530 GOSUB 27000:IF AB THEN 7000 ELSE GOSUB 27500:IF AB THEN 7000
7540 PRINT#1,FNC$("Table of Students' Percentages in Each Activity:"):PRINT#1,:SP=2*(W+FI-LA):PRINT#1,SPACE$(SP+14)"Activity:";:FOR A=FI TO LA:PRINT#1,USING" ###";A;:NEXT:PRINT#1," Average":PRINT#1,SPACE$(SP+14)STRING$(9,"=");:FOR A=FI TO LA
7550 PRINT#1," ==";:NEXT:PRINT#1," =======":LIN=LIN+4:F$=SPACE$(SP-1)+"###:\"+SPACE$(18)+"\":Z1=0:Z2=0:FOR A=1 TO NUMST:X=0:Y=0:ST=I(A):GOSUB 29500:PRINT#1,USING F$;A;A$;:FOR AC=1 TO FI-1:IF GR(ST,AC)>=0 THEN X=X+GR(ST,AC)/GR(0,AC)*WT(AC):Y=Y+WT(AC)
7560 NEXT:FOR AC=FI TO LA:IF GR(ST,AC)<0 THEN PRINT#1," --"; ELSE Z=GR(ST,AC)/GR(0,AC):X=X+Z*WT(AC):Y=Y+WT(AC):PRINT#1,USING"####";Z*100;
7570 NEXT:IF Y>0 THEN PRINT#1,USING" ####.# %";X/Y*100:Z1=Z1+X/Y:Z2=Z2+1 ELSE PRINT#1," ----"
7580 GOSUB 27600:IF AB THEN 7590 ELSE NEXT:PRINT#1,:GOSUB 27600:IF Z2>0 THEN PRINT#1,USING SPACE$(WID\2-13)+"Class Average:####.## %";Z1/Z2*100:GOSUB 27600
7590 GOSUB 27700:GOTO 7000
7600 GOSUB 20260:IF AB THEN 7000
7610 GOSUB 27500:IF AB THEN 7000 ELSE PRINT#1,FNC$("Summary of Activities:"):PRINT#1,:F$=SPACE$(7)+FMT1$+SPACE$(5)+FMT2$+SPACE$(5)+FMT2$+SPACE$(5)+"###.# %"
7630 X=9.9999E-05:FOR AC=1 TO NUMAC:X=X+WT(AC):NEXT:FOR AC=1 TO NUMAC:PRINT#1,USING F$;AC;AC$(AC);FNM$(GR(0,AC));FNM$(WT(AC));WT(AC)/X*100:GOSUB 27600:IF AB THEN 7650
7640 NEXT:PRINT#1,SPACE$(49)"------"SPACE$(5)STRING$(8,"-"):GOSUB 27600:PRINT#1,USING SPACE$(22)+"Weight of All Activities:#####.##"+SPACE$(5)+"100.0 %";X/100:GOSUB 27600
7650 GOSUB 27700:GOTO 7000
7700 GOSUB 20250:IF AB THEN 7000 ELSE GOSUB 27000:IF AB THEN 7000
7710 GOSUB 27500:IF AB THEN 7000 ELSE PRINT#1,FNC$("Class Roster:"):PRINT#1,:PRINT#1,SPACE$(20)"Name"SPACE$(26)"ID Code":PRINT#1,SPACE$(20)"----"SPACE$(26)STRING$(7,"-"):LIN=LIN+4
7720 FOR A=1 TO NUMST:ST=I(A):GOSUB 29500:PRINT#1,USING SPACE$(14)+FMT1$+SPACE$(8)+"\"+SPACE$(10)+"\";A;A$;ID$(ST):GOSUB 27600:IF AB THEN 7730 ELSE NEXT
7730 GOSUB 27700:GOTO 7000
7800 GOSUB 20260:IF AB THEN 7000 ELSE CLS:M$=T$(CH1):GOSUB 21450:GOSUB 21500:COLOR 15,0:LOCATE 4,21:PRINT" Category ":LOCATE 4,44:PRINT" Min. Percent ":COLOR 7,0
7810 F$="###. [\"+SPACE$(8)+"\]"+SPACE$(15)+"["+FMT2$+"]":FOR A=NUMLG+1 TO MAXLG:LG(A)=0:NEXT:OKEX$=ESC$+FIL$+FKEY2$+REGEX$
7815 FLIN=1:CURR=1:LEFSIDE=TRUE:LLIN=WSIZ:IF LLIN>MAXLG THEN LLIN=MAXLG
7820 FOR A=FLIN TO LLIN:LOCATE WTOP+A-FLIN,WLEF:PRINT USING F$;A;LG$(A);FNM$(LG(A)):NEXT:LOCATE 22,8:PRINT"Are these the correct letter grade categories?";:GOSUB 20020:IF YES THEN 7920
7830 LOCATE 2,11:PRINT"You may edit the letter grade categories before continuing.":GOSUB 21550:LOCATE 22,26:PRINT"<F1> to permanently save these categories,"SPACE$(10):PRINT TAB(26)"<F2> to proceed without saving them, <ESC> to cancel."
7850 IF NOT LEFSIDE THEN LG(CURR)=X:IF X>LG(CURR+(CURR>1)) OR X<LG(CURR-(CURR<MAXLG)) THEN M$="Must be in descending order":GOSUB 21200:GOTO 7840
7860 IF CHANGED AND CURR>NUMLG THEN NUMLG=CURR
7870 IF EX$=RET$ THEN CURR=CURR+1:LEFSIDE=TRUE ELSE IF EX$=DNARR$ THEN CURR=CURR+1 ELSE IF EX$=UPARR$ THEN CURR=CURR-1 ELSE IF EX$=TAB$ THEN LEFSIDE=NOT LEFSIDE:IF LEFSIDE THEN CURR=CURR+1
7880 IF EX$=ESC$ THEN 7000
7890 IF CURR<1 THEN CURR=1 ELSE IF CURR>MAXLG THEN CURR=MAXLG
7900 IF EX$<>FKEY1$ AND EX$<>FKEY2$ THEN 7840
7910 IF LG(MAXLG)<>0 THEN M$="The last minimum must be 0":GOSUB 21200:GOTO 7840 ELSE IF EX$=FKEY1$ THEN GOSUB 22510
7920 GOSUB 27000:IF AB THEN 7000 ELSE IF NOT AVGS THEN GOSUB 26500
7930 GOSUB 27500:IF AB THEN 7000 ELSE PRINT#1,FNC$("Student Averages and Letter Grade Equivalents:"):PRINT#1,:LIN=LIN+2:FOR A=1 TO NUMST:ST=I(A):GOSUB 29500:PRINT#1,USING SPACE$(11)+FMT1$+SPACE$(10);A;A$;
7940 IF GR(ST,0)<0 THEN PRINT#1,"No Grade" ELSE PRINT#1,USING"####.# %";GR(ST,0)/100;:B=1:WHILE LG(B)>GR(ST,0)+5:B=B+1:WEND:PRINT#1,SPACE$(5)LG$(B)
7950 GOSUB 27600:IF AB THEN 7960 ELSE NEXT:IF GR(0,0)>=0 THEN PRINT#1,:GOSUB 27600:PRINT#1,USING SPACE$(27)+"Class Average:####.## %";GR(0,0)/100:GOSUB 27600
7960 GOSUB 27700:GOTO 7000
8000 REM
8010 REM - Additional routine added by Carl Stoots, Inc.
8020 REM - Sorts by last name and prints special weekly roster
8030 REM
8041 GOSUB 20250 : IF AB THEN 7000 ELSE GOSUB 27000 : IF AB THEN 7000
8042 GOSUB 27500 : IF AB THEN 7000 ELSE PRINT#1,FNC$("Weekly Class Roster:")
8045 REM OPEN PRNAM$ FOR OUTPUT AS #1
8047 REM PRINT #1,FNC$("Class: "+CL$(CL)) : PRINT #1,
10000 CLS:LOCATE 3:M$=T$(CH):GOSUB 21450:LOCATE 10,17:PRINT"Please insert a different data disk in drive "DDRIVE$", and":PRINT TAB(17)"press <ENTER> to continue:":LOCATE 15,17:PRINT"(Or press <ESC> to cancel and return to the menu)"
10010 LOCATE 11,43:OK$=ESC$+RET$:GOSUB 20200:IF CHAR=1 THEN 500 ELSE CLS:GOTO 41050
11020 A$=F$+"[\"+SPACE$(18)+"\]":LOCATE 4,1:PRINT USING A$;"Data drive (A: to D:), or pathname";DDRIVE$:PRINT:PRINT USING A$;"Backup drive or pathname";BDRIVE$:PRINT:PRINT USING F$+"[!]";"Printer Number (1, 2, or 3)";RIGHT$(PRNAM$,2)
11030 PRINT:PRINT USING F$;"Codes to initialize printer (if any)";:FOR A=1 TO 13 STEP 3:PRINT USING"[\ \] ";MID$(PRCODE$+SPACE$(15),A,3);:NEXT:PRINT
11260 ILEN=3:GOSUB 20100:A=VAL(IN$):IF A>255 THEN PRINT MID$(B$,POSN,3);:BEEP:GOTO 11250 ELSE MID$(B$,POSN,3)=IN$
11270 IF EX$=TAB$ AND POSN<13 THEN POSN=POSN+3:GOTO 11250 ELSE WHILE RIGHT$(B$,3)=" ":B$=LEFT$(B$,LEN(B$)-3):WEND:PRCODE$=B$:RETURN
19000 CLS:LOCATE 10,10:PRINT"Do you really wish to end the session now?";:GOSUB 20020:IF NO THEN 500
19010 CLS:LOCATE 8,20:PRINT"You may remove the disks now.":PRINT:PRINT TAB(20)"Press <ENTER> to return to DOS:";:OK$=RET$:GOSUB 20200:CLS:SYSTEM
20000 GOSUB 21100:PRINT TAB(23)"--- Press any key to continue ---";:WHILE INKEY$<>"":WEND:WHILE INKEY$="":WEND:GOSUB 21100:RETURN
20020 PRINT" (Y/N):";:OK$=("YN"):GOSUB 20200:PRINT IN$:IF IN$="Y" THEN YES=TRUE ELSE YES=FALSE
20030 NO=NOT YES:RETURN
20050 GOSUB 20060:IF NOT CHANGED THEN RETURN ELSE IF X<0 THEN GOSUB 20080:GOTO 20050 ELSE RETURN
20060 Y=X:ILEN=6:OK$=NUMS$+"Ii":IF X<0 THEN IN$="I " ELSE IN$=MID$(STR$(X/100)+SPACE$(5),2,6)
20065 GOSUB 20100:IF NOT CHANGED THEN RETURN ELSE X=INT(VAL(IN$)*100+0.5):IF X<0 OR X>30000 THEN GOSUB 20080:GOTO 20060 ELSE IF X=0 THEN IF INSTR(IN$,"I") OR INSTR(IN$,"i") THEN X=-1
20070 PRINT FNM$(X);:LOCATE,BEGCX:RETURN
20080 M$="Must be between 0 and 300":GOSUB 21200:X=Y:PRINT FNM$(X);:LOCATE,BEGCX:RETURN
20110 A$="":WHILE A$="":A$=INKEY$:WEND:IF A$=RET$ OR INSTR(OKEX$,A$) MOD 2 THEN EX$=A$:LOCATE CY,BEGCX,0:WHILE INKEY$<>"":WEND:RETURN
20120 IF A$=LEFARR$ OR A$=BACKSP$ THEN IF CX>BEGCX THEN CX=CX-1:LOCATE CY,CX:IF A$=BACKSP$ THEN PRINT" ";:LOCATE CY,CX:MID$(IN$,CX-BEGCX+1,1)=" ":GOTO 20110 ELSE 20110 ELSE 20110
20130 IF A$=RIGARR$ THEN IF CX-BEGCX<ILEN THEN CX=CX+1:LOCATE CY,CX:GOTO 20110 ELSE 20110
20140 IF (OK$<>"" AND INSTR(OK$,A$)=0) OR A$<" " OR A$>CHR$(126) OR A$=CHR$(34) OR CX-BEGCX>=ILEN THEN 20110
20200 LOCATE,,1:IN$="":WHILE IN$="":IN$=INKEY$:WEND:IF IN$>="a" AND IN$<="z" THEN IN$=CHR$(ASC(IN$)-32)
20210 IF OK$<>"" THEN CHAR=INSTR(OK$,IN$) ELSE CHAR=1
20215 IF CHAR THEN LOCATE,,0:RETURN ELSE 20200
20220 IF MORE THEN PRINT"Press <ENTER> to see more of the list, or"
20230 PRINT"Type the number of the "M$" you want "M2$"and press <ENTER>:[ ]";:A=POS(0):PRINT::PRINT"(Or press <ESC> to return to the menu)";:LOCATE CSRLIN-1,A-4:IN$=" "
20240 AB=FALSE:ILEN=3:OK$=NUMS$:OKEX$=ESC$:GOSUB 20100:IF EX$=ESC$ THEN CH=0:AB=TRUE:PRINT:PRINT:RETURN ELSE CH=VAL(IN$):IF CH=0 AND MORE THEN RETURN ELSE IF CH<1 OR CH>MAX THEN BEEP:GOTO 20240 ELSE PRINT:PRINT:RETURN
20250 GOSUB 20300:IF AB THEN RETURN ELSE GOSUB 22200:IF NUMST=0 THEN CLS:LOCATE 10,26:PRINT"This Class Has No Students.":GOSUB 20000:AB=TRUE:RETURN ELSE RETURN
20260 GOSUB 20250:IF AB THEN RETURN ELSE IF NUMAC=0 THEN CLS:LOCATE 10,25:PRINT"This Class Has No Activities.":GOSUB 20000:AB=TRUE:RETURN ELSE RETURN
20300 CLS:IF NUMCL<=0 THEN LOCATE 10,25:PRINT"No Classes Have Been Entered.":GOSUB 20000:AB=TRUE:RETURN ELSE AB=FALSE:M$=T$(CH):GOSUB 21450:PRINT:PRINT:PRINT TAB(26)"Which Class Would You Like?":PRINT
20310 OK$=LEFT$(CLNUM$,NUMCL)+ESC$:FOR A=1 TO NUMCL:PRINT TAB(28)MID$(OK$,A,1)". "CL$(A):NEXT
20320 PRINT:PRINT TAB(20)"Type the number of the class you want:":PRINT TAB(20)"(or press <ESC> to return to the menu) ";:LOCATE CSRLIN-1:GOSUB 20200:PRINT IN$:PRINT:IF CHAR=NUMCL+1 THEN AB=TRUE:RETURN ELSE CL=CHAR:RETURN
20400 D=1
20410 CLS:GOSUB 21400:C=D:WHILE D<=NUMST AND D-C<30:LOCATE(D-1)MOD 15+3,(((D-1)MOD 30)\15)*40+1:PRINT USING FMT1$;D;ST$(D):D=D+1:WEND:LOCATE 21,1:M$="student":MAX=NUMST:MORE=D<=NUMST:GOSUB 20220:IF AB THEN RETURN
20420 IF CH=0 THEN 20410 ELSE ST=CH:RETURN
20450 D=1:M2$=""
20459 'Alt. entry
20460 CLS:GOSUB 21400:C=D:WHILE D<=NUMAC AND D-C<30:LOCATE(D-1)MOD 15+3,(((D-1)MOD 30)\15)*40+1:PRINT USING FMT1$;D;AC$(D):D=D+1:WEND:LOCATE 21,1:MAX=NUMAC:MORE=D<=NUMAC:M$="activity":GOSUB 20220:IF AB THEN RETURN
20470 IF CH=0 THEN 20460 ELSE AC=CH:RETURN
21000 CLS:PRINT TAB(16)"Report Card: A Grading System for the Teacher":PRINT TAB(12)"IBM PC Version 1.00, Copyright 1983 by Marc Ringuette":PRINT:PRINT:M$=T$:GOSUB 21450:PRINT:PRINT TAB(28)"You have these choices:":PRINT:PRINT
21009 'Alt. Entry
21010 FOR A=1 TO NUMCH:PRINT TAB(15)"<"A"> -- "T$(A):NEXT:PRINT:PRINT TAB(15)"<ESC> -- "T$(0):PRINT:PRINT:PRINT TAB(29)"Your Choice (1 to"STR$(NUMCH)"):";:OK$=ESC$+LEFT$("12345678",NUMCH):GOSUB 20200:PRINT IN$:CH=VAL(IN$):IF CH=0 THEN CH=NUMCH+1
21450 COLOR 15,0:PRINT TAB(39-LEN(M$)/2)M$:COLOR 7,0:RETURN
21500 LOCATE WTOP-1,WLEF-1:PRINT"KEY";:FOR A=WLEF TO WRIG:PRINT"THEN";:NEXT:PRINT"CLOSE":FOR A=WTOP TO WBOT:LOCATE A,WRIG+1:PRINT"OPEN":NEXT:LOCATE WBOT+1,WRIG+1:PRINT"LOAD";:FOR A=WRIG TO WLEF STEP -1:LOCATE WBOT+1,A:PRINT"THEN":NEXT:LOCATE WBOT+1,WLEF-1:PRINT"SCREEN"
21520 FOR A=WBOT TO WTOP STEP -1:LOCATE A,WLEF-1:PRINT"OPEN":NEXT:RETURN
21550 LOCATE 21,15:PRINT"Commands: Move with Arrow Keys, <TAB>, or <ENTER>;":IF INSTR(OKEX$,INS$) MOD 2 THEN PRINT TAB(26)"<INS> to insert a "M$", <DEL> to delete a "M$";"
21560 PRINT TAB(26)"<F1> to exit and keep changes";:IF INSTR(OKEX$,ESC$) MOD 2 THEN PRINT"; <ESC> to cancel.";:RETURN ELSE PRINT".";:RETURN
22110 A$=DRIVE$+"GRAD"+MID$(CLNUM$,A,1)+".DAT":B$=DRIVE$+"GRAD"+MID$(CLNUM$,B,1)+".DAT":C$=DRIVE$+"GRADXX.DAT":NAME A$ AS C$:NAME B$ AS A$:NAME C$ AS B$
22115 A$=DRIVE$+"INFO"+MID$(CLNUM$,A,1)+".DAT":B$=DRIVE$+"INFO"+MID$(CLNUM$,B,1)+".DAT":C$=DRIVE$+"INFOXX.DAT":NAME A$ AS C$:NAME B$ AS A$:NAME C$ AS B$:RETURN
22120 NAME DRIVE$+"GRAD"+MID$(CLNUM$,B,1)+".DAT"AS DRIVE$+"GRAD"+MID$(CLNUM$,A,1)+".DAT":NAME DRIVE$+"INFO"+MID$(CLNUM$,B,1)+".DAT"AS DRIVE$+"INFO"+MID$(CLNUM$,A,1)+".DAT":RETURN
22200 IF LOADED=CL THEN RETURN ELSE DRIVE$=DDRIVE$
22209 'Alt. Entry
22210 PRINT:PRINT TAB(25)"--- Reading Class Data ---":GOSUB 22000:ST=0:GOSUB 22010:NUMST=CVI(MID$(ID$(0),1,2)):NUMAC=CVI(MID$(ID$(0),3,2)):FOR ST=0 TO NUMST:GOSUB 22010:NEXT:GOSUB 22090
22220 GOSUB 22050:FOR A=1 TO NUMAC:INPUT#1,AC$(A),WT(A):NEXT:GOSUB 22090:LOADED=CL:RETURN
22300 DRIVE$=DDRIVE$
22309 'Alt. Entry
22310 CLS:LOCATE 10,25:PRINT"--- Recording Class Data ---":LOADED=CL:GOSUB 22000:ID$(0)=MKI$(NUMST)+MKI$(NUMAC):ST$(0)=CL$(CL):FOR ST=0 TO NUMST:GOSUB 22020:NEXT:GOSUB 22090
22319 'Alt. Entry
22320 GOSUB 22060:FOR A=1 TO NUMAC:WRITE#1,AC$(A),WT(A):NEXT:GOSUB 22090:RETURN
22350 CLS:LOCATE 10,23::PRINT"--- Recording Modified Data ---":RETURN
22510 OPEN"o",1,DDRIVE$+"SYSINFO.DAT":WRITE#1,PRNAM$,PRCODE$,NUMCL:FOR A=1 TO NUMCL:WRITE#1,CL$(A):NEXT:WRITE#1,NUMLG:FOR A=1 TO NUMLG:WRITE#1,LG$(A),LG(A):NEXT:CLOSE#1:RETURN
22600 M$="save":GOSUB 29050
22610 IF CHAR=2 THEN DRIVE$=BDRIVE$:GOSUB 22310:GOSUB 29100
22620 RETURN
22700 CLS:LOCATE 9,20:PRINT"Would you like to save a backup copy":PRINT TAB(20)"of this class' data now?";:GOSUB 20020:IF YES THEN GOSUB 22600
22710 RETURN
25000 F$="\"+SPACE$(30)+"\ [\":F2$=" \]":CLS:LOCATE 2,20:PRINT"Class: "CL$(CL)TAB(50)"Activity:"AC:LOCATE 5,10:PRINT USING F$+SPACE$(14)+F2$;"Activity Name";AC$(AC):LOCATE 7,10:PRINT USING F$+F2$;"Total (.01 to 300)";FNM$(GR(0,AC))
25010 LOCATE 9,10:PRINT USING F$+F2$;"Weight (0 to 300)";FNM$(WT(AC)):OKEX$=ESC$+FIL$+REGEX$
25015 GOSUB 21550
25020 LOCATE 5,44:IN$=AC$(AC):ILEN=20:OK$="":GOSUB 20100:AC$(AC)=IN$:IF EX$=ESC$ OR EX$=FKEY1$ THEN 25050 ELSE IF EX$=UPARR$ THEN 25040 ELSE 25030
25030 LOCATE 7,44:X=GR(0,AC):GOSUB 20050:GR(0,AC)=X:IF X<1 THEN BEEP:GOTO 25030 ELSE IF EX$=ESC$ OR EX$=FKEY1$ THEN 25050 ELSE IF EX$=UPARR$ THEN 25020 ELSE 25040
25040 LOCATE 9,44:X=WT(AC):GOSUB 20050:WT(AC)=X:IF EX$=UPARR$ THEN 25030
25050 IF EX$=ESC$ THEN M$="abandon what you have just entered":GOSUB 21250:IF YES THEN AB=TRUE ELSE 25020 ELSE AB=FALSE
25520 OKEX$=ESC$+FIL$+REGEX$:GOSUB 21550:F$=FMT1$+SPACE$(8)+"[":FLIN=1:CURR=1:LLIN=WSIZ:IF LLIN>NUMST THEN LLIN=NUMST
25530 FOR A=FLIN TO LLIN:LOCATE WTOP+A-FLIN,WLEF:GOSUB 29020:NEXT
25600 LOCATE WTOP+CURR-FLIN,50:X=GR(CURR,AC):GOSUB 20060:IF CHANGED THEN IF X<=3*GR(0,AC) THEN GR(CURR,AC)=X ELSE M$="Too large - total is "+FNM$(GR(0,AC)):GOSUB 21200:PRINT FNM$(GR(CURR,AC)):GOTO 25600
25620 IF EX$=RET$ OR EX$=TAB$ OR EX$=DNARR$ THEN IF CURR<NUMST THEN CURR=CURR+1:IF CURR>LLIN THEN GOSUB 21600:FLIN=FLIN+1:LLIN=CURR:LOCATE WBOT,WLEF:A=LLIN:GOSUB 29020 ELSE ELSE BEEP:GOSUB 29400:IF YES THEN 25700
25630 IF EX$=UPARR$ THEN IF CURR>1 THEN CURR=CURR-1:IF CURR<FLIN THEN GOSUB 21610:FLIN=CURR:LLIN=LLIN-1:LOCATE WTOP,WLEF:A=FLIN:GOSUB 29020
25680 IF EX$=ESC$ THEN M$="abandon all changes":GOSUB 21250:IF YES THEN AB=TRUE:RETURN
25690 IF EX$<>FKEY1$ THEN 25600
25700 AB=FALSE:RETURN
26000 CLS:LOCATE 10,20:PRINT"Searching for last names:";:FOR A=NUMST TO 1 STEP -1:LOCATE 10,47:PRINT USING"###";A:B=LEN(ST$(A)):WHILE MID$(ST$(A),B,1)=" " AND B>1:B=B-1:WEND:WHILE MID$(ST$(A),B,1)<>" "AND B>1:B=B-1:WEND:IF MID$(ST$(A),B,1)=" "THEN B=B+1
26150 GR(0,0)=NUMST*100:FOR A=1 TO NUMST:GR(A,0)=A*100:NEXT:AC1=AC:AC=0
26160 CLS:M$=T$(CH):GOSUB 21450:PRINT TAB(15)"You may reassign student positions in the class,":PRINT TAB(15)"ensuring that all numbers are used once."
26170 GOSUB 21500:COLOR 15,0:LOCATE 4,24:PRINT" Student ":LOCATE 4,48:PRINT" Position ":COLOR 7,0:GOSUB 25520:IF AB THEN RETURN ELSE FOR A=1 TO NUMST:I(A)=0:NEXT:FOR A=1 TO NUMST:IF GR(A,0)>99 AND GR(A,0)<=NUMST*100 THEN I(GR(A,0)\100)=1
26180 NEXT:FOR A=1 TO NUMST:IF I(A)=0 THEN M$="Invalid order -- all numbers not included":GOSUB 21200:GOTO 26160 ELSE NEXT
26190 FOR A=1 TO NUMST:I(GR(A,0)/100)=A:NEXT:AB=FALSE:AC=AC1:RETURN
26200 CLS:LOCATE 10,34:PRINT"Sorting:":FOR A=1 TO NUMST:I(A)=A:NEXT:S=NUMST:IF S<2 THEN RETURN ELSE IF S=3 THEN S=2
26210 S=S\3+1:LOCATE 10,43:PRINT USING"###";S:FOR A=1 TO S:FOR B=A TO NUMST-S STEP S:C=B
26220 D=I(C):E=I(C+S):IF NAMES THEN IF MID$(ST$(D),J(D))+" "+ST$(D)<=MID$(ST$(E),J(E))+" "+ST$(E) THEN 26240 ELSE ELSE IF IDS THEN IF ID$(D)+ST$(D)<=ID$(E)+ST$(E) THEN 26240 ELSE ELSE IF GR(D,0)>=GR(E,0) THEN 26240
26230 I(C)=E:I(C+S)=D:IF C>A THEN C=C-S:GOTO 26220
26240 NEXT:NEXT:IF S>1 THEN 26210 ELSE RETURN
26300 CLS:LOCATE 10,30:PRINT"Rearranging order:":LOADED=0:FOR A=1 TO NUMST-1:LOCATE 10,50:PRINT USING"###";NUMST-A:S=I(A)
26310 IF S>A THEN 26320 ELSE IF S=A THEN 26330 ELSE S=I(S):GOTO 26310
26320 SWAP ST$(A),ST$(S):SWAP ID$(A),ID$(S):FOR B=1 TO NUMAC:SWAP GR(A,B),GR(S,B):NEXT
26330 NEXT:LOADED=CL:RETURN
26500 CLS:LOCATE 8,20:PRINT"Would you like to include all activities":PRINT TAB(20)"in the averages?";:GOSUB 20020:IF YES THEN FOR A=1 TO NUMAC:J(A)=1:NEXT:GOTO 26520
26510 CLS:PRINT TAB(20)"Choose which to include:":PRINT:FOR A=1 TO NUMAC:PRINT USING FMT1$+SPACE$(10);A;AC$(A);:GOSUB 20020:J(A)=-YES:NEXT
26520 CLS:LOCATE 11,25:PRINT"Calculating percentages:":Z=0:C=0:FOR A=1 TO NUMST:LOCATE 11,50:PRINT USING"###";NUMST+1-A:X=0:Y=0:FOR B=1 TO NUMAC:IF GR(A,B)>=0 THEN X=X+GR(A,B)/GR(0,B)*WT(B)*J(B):Y=Y+WT(B)*J(B)
26530 NEXT:IF Y>0 THEN GR(A,0)=X/Y*10000:Z=Z+X/Y:C=C+1 ELSE GR(A,0)=-1
26540 NEXT:IF C>0 THEN GR(0,0)=Z/C*10000 ELSE GR(0,0)=0
26550 RETURN
27000 T$=T$(CH1):NUMCH=8:T$(1)=P1$+"in Normal Order":T$(2)="Sort by Last Names":T$(3)="Sort by First Names":T$(4)="Sort by ID Codes":T$(5)="Sort by Averages":T$(6)="Design Your Own Order"
27010 T$(7)="Omit Names from Output":T$(8)="Replace Names with ID Codes":T$(0)="Return to "+P1$+"Menu":OMIT=FALSE:CODE=FALSE
27020 GOSUB 21000:IF CH=NUMCH+1 THEN AB=TRUE:RETURN ELSE IF CH=7 THEN OMIT=TRUE:NUMCH=6:GOTO 27020 ELSE IF CH=8 THEN CODE=TRUE:NUMCH=6:GOTO 27020 ELSE AB=FALSE:ON CH GOSUB 27100,26000,26050,26080,26100,26150:T$(CH)=T$:RETURN
27100 FOR A=1 TO NUMST:I(A)=A:NEXT:NAMES=FALSE:IDS=FALSE:AVGS=FALSE:RETURN
27500 CLS:IF NOT PR THEN 27550 ELSE LOCATE 6,10:PRINT"You may enter the date (or other information), to be included":PRINT TAB(10)"in the printout. Press <ENTER> when done, or <ESC> to cancel.":PRINT:PRINT" ["HEAD$;:LOCATE,79:PRINT"]":LOCATE 9,3
27510 IN$=HEAD$:ILEN=76:OK$="":OKEX$=ESC$:GOSUB 20100:HEAD$=IN$:WHILE RIGHT$(HEAD$,1)=" ":HEAD$=LEFT$(HEAD$,LEN(HEAD$)-1):WEND:IF EX$=ESC$ THEN AB=TRUE:RETURN
27520 LOCATE 12,20:PRINT"Please ensure that the printer is on,":PRINT TAB(20)"and at the top of a page.":LOCATE 15,20:PRINT"Press <ESC> to escape,":PRINT TAB(20)"or any other key to continue:";:OK$="":GOSUB 20200
27530 IF IN$=ESC$ THEN AB=TRUE:RETURN ELSE CLS:LOCATE 9,30:PRINT"Printing...":LOCATE 11,10:PRINT"(Press <ESC> to cancel printing while in progress)"
27550 AB=FALSE:IF PR THEN OPEN PRNAM$ FOR OUTPUT AS #1:FOR D=1 TO LEN(PRCODE$) STEP 3:PRINT#1,CHR$(VAL(MID$(PRCODE$,D,3)));:NEXT ELSE OPEN"SCRN:"FOR OUTPUT AS #1
27569 'Alt. Entry
27570 PRINT#1,FNC$("Class: "+CL$(CL)):PRINT#1,:LIN=2:IF PR AND HEAD$<>"" THEN PRINT#1,FNC$(HEAD$):PRINT#1,:LIN=4
27590 RETURN
27600 AB=INKEY$=ESC$:IF AB THEN WHILE INKEY$<>"":WEND
27610 LIN=LIN+1:IF NOT PR THEN IF LIN MOD 22=0 THEN GOSUB 20000:CLS:LAST=TRUE ELSE LAST=FALSE ELSE LAST=TRUE
27620 RETURN
27700 GOSUB 27800:CLOSE#1:RETURN
27800 IF PR THEN PRINT#1,CHR$(12);:RETURN ELSE IF NOT LAST THEN GOSUB 20000:CLS:RETURN
28200 FOR A=1 TO 5:IF A>LEN(A$) THEN PRINT"[ ] "; ELSE PRINT USING"[###] ";ASC(MID$(A$,A));
29020 PRINT USING F$;A;ST$(A);:IF GR(A,AC)<0 THEN PRINT"I ]" ELSE PRINT MID$(STR$(GR(A,AC)/100)+SPACE$(5),2,6)"]"
29030 RETURN
29050 CLS:LOCATE 6:GOSUB 21400:PRINT:IF BDRIVE$=DDRIVE$ THEN PRINT TAB(5)"Please remove your regular data disk from drive "DDRIVE$", and"
29060 PRINT TAB(5)"Ensure that your backup disk is in drive "BDRIVE$"."
29070 LOCATE 13,10:PRINT"Press <ENTER> to "M$" the backup copy,":PRINT TAB(10)"or press <ESC> to cancel:";:OK$=ESC$+RET$:GOSUB 20200:RETURN
29100 IF BDRIVE$=DDRIVE$ THEN CLS:LOCATE 10,15:PRINT"Done. Please re-insert your regular data disk.":GOSUB 20000
29110 RETURN
29300 OK$="":ILEN=20:GOSUB 20100:A=20:WHILE A>1 AND MID$(IN$,A,1)=" ":A=A-1:WEND:A$=LEFT$(IN$,A):A=INSTR("abcd",LEFT$(A$,1)):IF A>0 THEN MID$(A$,1,1)=MID$("ABCD",A,1)
29310 IF INSTR("ABCD",LEFT$(A$,1))=0 OR MID$(A$,2,1)<>":" THEN BEEP:GOTO 29300
29320 PRINT A$:RETURN
29400 M$="Are you ready to exit and keep what you have entered":GOSUB 21350:RETURN
29500 IF OMIT THEN A$="":RETURN ELSE IF CODE THEN A$=ID$(ST):RETURN ELSE A$=ST$(ST):RETURN
30000 WHILE INKEY$<>"":WEND:ATEMP=A
30020 IF ERL>40999 AND ERL<41500 THEN RESUME 41500
30040 IF ERL>21999 AND ERL<23000 THEN M$=" Disk" ELSE IF ERL>27549 AND ERL<27571 THEN M$=" Printer" ELSE M$="n Execution"
30070 ER$="":IF ERR=71 THEN ER$="Disk Not Ready" ELSE IF ERR=61 OR ERR=67 THEN ER$="Disk full or bad pathname"ELSE IF ERR=53 THEN ER$="File Not Found"
30090 IF ER$<>"" THEN PRINT TAB(20)"Error Type: "ER$:PRINT
30100 NUMCH=4:T$(1)="Continue (If you have fixed the problem)":T$(2)="Re-Start System (Advisable if you haven't fixed it)":T$(3)="Save a Backup Copy of the Current Class Data":T$(4)="Proceed Directly to Main Menu":T$(0)="End Session"
30110 PRINT:PRINT TAB(28)"You have these choices:":PRINT:PRINT:GOSUB 21010:CLS:ON CH GOTO 30150,30160,30170,30180,30190
30150 PRINT"Continuing...":A=ATEMP:RESUME
30160 RUN
30170 IF LOADED=CL AND LOADED>0 THEN CLOSE#1:GOSUB 22600:RUN ELSE LOCATE 10,25:PRINT"No Class Data is in Memory.":GOSUB 20000:GOTO 30060
40020 X=FRE(0):IF X<2500+MAXST*(40+2*MAXAC)+25*MAXAC THEN PRINT"Insufficient memory for program data.":STOP
40030 IF MAXCL>MAXST OR MAXAC>112 OR MAXLG>15 THEN PRINT"Error: check values at line 40010.":STOP
40040 RECL=32+2*MAXAC:A=MAXST:B=0:C=0:D=0:WID=80:IF MAXAC>A THEN A=MAXAC
40050 DIM GR(MAXST,MAXAC),WT(MAXAC),ST$(MAXST),ID$(MAXST),AC$(MAXAC),I(A),J(A),CL$(MAXCL),LG$(MAXLG),LG(MAXLG),T$(8)
40060 SCROLLUP$=SPACE$(19):SCROLLDN$=SCROLLUP$:A$="55B001B504B10EB612B23FB707B406CD105DCB":FOR A=1 TO 19:MID$(SCROLLUP$,A,1)=CHR$(VAL("&H"+MID$(A$,A*2-1,2))):NEXT